//给你两个有序整数数组 nums1 和 nums2，请你将 nums2 合并到 nums1 中，使 nums1 成为一个有序数组。 
//
// 
//
// 说明: 
//
// 
// 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 
// 你可以假设 nums1 有足够的空间（空间大小大于或等于 m + n）来保存 nums2 中的元素。 
// 
//
// 
//
// 示例: 
//
// 输入:
//nums1 = [1,2,3,0,0,0], m = 3
//nums2 = [2,5,6],       n = 3
//
//输出: [1,2,2,3,5,6] 
// Related Topics 数组 双指针 
// 👍 609 👎 0

package leetcode.editor.cn;

//Java：合并两个有序数组
public class P88MergeSortedArray {

    /**
     *
     * 思路：网上的答案，指针从后遍历
     *
     * 执行用时： 0 ms , 在所有 Java 提交中击败了 100.00% 的用户 内存消耗： 39.9 MB , 在所有 Java 提交中击败了 53.65% 的用户
     *
     */
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public void merge(int[] nums1, int m, int[] nums2, int n) {

            int p1 = m - 1;
            int p2 = n - 1;
            int i = m + n - 1;

            while (p1 >= 0 && p2 >= 0) {
                if(nums1[p1] > nums2[p2]){
                    nums1[i] = nums1[p1];
                    p1 --;
                    i--;
                }else{
                    nums1[i] = nums2[p2];
                    p2--;
                    i--;
                }
            }

            System.arraycopy(nums2, 0, nums1, 0, p2 + 1);


        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

    public static void main(String[] args) {
        Solution solution = new P88MergeSortedArray().new Solution();
        int[] nums1 = new int[]{0};
        int[] nums2 = new int[]{1};
        solution.merge(nums1,0,nums2,1);
        System.out.println(nums1);
        // TO TEST
    }

}